package com.mall.service.commodity.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mall.commons.common.CommonPage;
import com.mall.model.domain.PmsProductAttribute;
import com.mall.model.domain.PmsProductAttributeCategory;
import com.mall.model.vo.PmsProductAttributeCategoryVo;
import com.mall.service.commodity.mapper.PmsProductAttributeCategoryMapper;
import com.mall.service.commodity.mapper.PmsProductAttributeMapper;
import com.mall.service.commodity.service.PmsProductAttributeCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class PmsProductAttributeCategoryServiceImpl extends
        ServiceImpl<PmsProductAttributeCategoryMapper, PmsProductAttributeCategory>
        implements PmsProductAttributeCategoryService {
    @Autowired
    private PmsProductAttributeCategoryMapper pmsProductAttributeCategoryMapper;
    @Autowired
    private PmsProductAttributeMapper pmsProductAttributeMapper;

    @Override
    public void create(String name) {
        PmsProductAttributeCategory pmsProductAttributeCategory = new PmsProductAttributeCategory();
        pmsProductAttributeCategory.setName(name);
        pmsProductAttributeCategoryMapper.insert(pmsProductAttributeCategory);
    }

    @Override
    public void deleteById(Long id) {
        pmsProductAttributeCategoryMapper.deleteById(id);
    }

    @Override
    public CommonPage<PmsProductAttributeCategory> seleteAll(Integer pageNum, Integer pageSize) {
        Page<PmsProductAttributeCategory> page = new Page<>(pageNum, pageSize);
        LambdaQueryWrapper<PmsProductAttributeCategory> queryWrapper = new LambdaQueryWrapper<>();
        Page<PmsProductAttributeCategory> selectPage = pmsProductAttributeCategoryMapper.selectPage(page, queryWrapper);
        CommonPage categoryPage = CommonPage.getPage(selectPage);
        return categoryPage;
    }

    @Override
    public List<PmsProductAttributeCategoryVo> listWithAttr() {
        LambdaQueryWrapper<PmsProductAttributeCategory> queryWrapper = new LambdaQueryWrapper<>();
        List<PmsProductAttributeCategory> pmsProductAttributeCategories = pmsProductAttributeCategoryMapper.selectList(queryWrapper);
        List<Long> idList = CollUtil.getFieldValues(pmsProductAttributeCategories, "id", Long.class);
        LambdaQueryWrapper<PmsProductAttribute> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(PmsProductAttribute::getProductAttributeCategoryId, idList);
        List<PmsProductAttribute> pmsProductAttributes = pmsProductAttributeMapper.selectList(wrapper);
        Map<Long, PmsProductAttribute> map = CollUtil.fieldValueMap(pmsProductAttributes, "productAttributeCategoryId");
        List<PmsProductAttributeCategoryVo> list = pmsProductAttributeCategories.stream().map((item) -> {
            PmsProductAttributeCategoryVo vo = new PmsProductAttributeCategoryVo();
            PmsProductAttribute pmsProductAttribute = map.get(item.getId());
            vo.setName(item.getName());
            vo.setAttributeCount(item.getAttributeCount());
            vo.setParamCount(item.getParamCount());
            vo.setId(item.getId());
            vo.setPmsProductAttribute(pmsProductAttribute);
            return vo;
        }).collect(Collectors.toList());
        return list;
    }

    @Override
    public void updateByCategoryId(Long id, String name) {
        PmsProductAttributeCategory pmsProductAttributeCategory = pmsProductAttributeCategoryMapper.selectById(id);
        pmsProductAttributeCategory.setName(name);
        pmsProductAttributeCategoryMapper.updateById(pmsProductAttributeCategory);
    }

    @Override
    public PmsProductAttributeCategory seleteById(Long id) {
        PmsProductAttributeCategory pmsProductAttributeCategory = pmsProductAttributeCategoryMapper.selectById(id);
        return pmsProductAttributeCategory;
    }
}
